#ifndef Territoire_h
#define Territoire_h

#include <vector>
#include <string>
#include <ostream>
#include "Model3D.h"
#include "PionManager.h"

class Continent;
class Territoire;
class Visitor;
class Joueur;
class Pion;

/**
 * Classe Territoire
 */
class Territoire {

   friend std::ostream & operator<<(std::ostream &, const Territoire &);

  public:
   
   Territoire(Continent * _continent, const char * _nom, int _id);
   ~Territoire();

   Continent * getContinent() { return continent; }
   const char * getNom() const { return nom; }
   const float * getCouleur() const { return couleur; }
   void setCouleur(float _r, float _v, float _b, float _a=0);
   void accept(Visitor * _visitor);
   
   Model3D * getModel3D() { return &model3D; }
   const Model3D * getModel3D() const { return &model3D; }

   bool isHighlighted() { return highlighted; }
   void setHighlighted() { highlighted=true; couleur[3] = .5f; }
   void setNotHighlighted() { highlighted=false; couleur[3] = 1.0f; }

   bool isSelected() { return selected; }
   void setSelected() { selected=true; }
   void setNotSelected() { selected=false; }
   void toggleSelected() { selected=!selected; }

   const int getId() const { return id; }

   const std::vector< std::string * > * getBordersName() const { return &borders_str; }
   const std::vector< int > * getBordersId() const { return &borders_int; }

   void addBorderByName(const char * _nom) { borders_str.push_back( new std::string(_nom) ); }
   void addBorderById(int _id) { borders_int.push_back( _id ); }
   bool isBorderOf(Territoire* _territoire);

   float getHauteur() const { return hauteur; }
   void setHauteur(float _h) { hauteur = _h; }
   void toggleHauteur();
   void toggleBordersHauteur();
   
   const Joueur * getJoueur() const;
   Joueur * getJoueur();
   bool appartientAuJoueur(Joueur * _joueur);
   bool hasEnemyInBorders();

   const int countNbPions() const;
   void addPion(Pion * _pion);
   void addPion(Joueur* _joueur, int nb);
   void removePion(Pion* _pion);
   void removePion(int nb);
   Pion* getPionByLevel(PionManager::Level _level);

   std::vector< Pion * > * getPions() { return &pions; }
   const std::vector< Pion * > * getPions() const { return &pions; }

   void placementPions(Point3D * centre);

   void setAlpha(float _a) { couleur[3]=_a; }
   float getAlpha() const { return couleur[3]; }

  protected:

   Continent * continent;
   char * nom;
   Model3D model3D;
   float couleur[4];
   bool highlighted;
   bool selected;
   int id;
   float hauteur;
   std::vector< Pion * > pions;
   std::vector< std::string * > borders_str;
   std::vector< int > borders_int;

};
#endif

